package com.lxp.lambda;

import com.sun.scenario.effect.impl.sw.sse.SSEBlend_SRC_OUTPeer;

import java.util.Arrays;
import java.util.List;
import java.util.function.Predicate;


/**
 * @Author swd
 * @Create 2020/12/1 0001 14:44
 */
public class LambdaExpression {
    /**
     * 如果一个接口中，有且只有一个抽象的方法（Object类中的方法不包括在内），那这个接口就可以被看做是函数式接口。
     *      java 8 提供的函数式接口
     *     Function：提供任意一种类型的参数，返回另外一个任意类型返回值。 R apply(T t);
     * 　  Consumer：提供任意一种类型的参数，返回空值。 void accept(T t);
     * 　  Supplier：参数为空，得到任意一种类型的返回值。T get();
     * 　　Predicate：提供任意一种类型的参数，返回boolean返回值。boolean test(T t);
    */
    public static void main(String[] args) {
        // method1();
        method2();
        method3();

    }

    private static void method3() {
        //计算给定数值中每个元素平方后的总和
        /*//Old way:
        List<Integer> list = Arrays.asList(1, 2, 3, 4, 5, 6, 7);
        int sum = 0;
        for (Integer n : list) {
            int x = n * n;
            sum = sum + x;
        }
        System.out.println(sum);*/

        //New way: MapReduce 的一个初级例子
        List<Integer> list = Arrays.asList(1, 2, 3, 4, 5, 6, 7);
        int sum = list.stream().map(x -> x * x).reduce((x, y) -> x + y).get();
        System.out.println(sum);
    }

    private static void method2() {
        List<Integer> list = Arrays.asList(1, 2, 3, 4, 5, 6, 7);

        System.out.println("Print all numbers:");
        evaluate(list, (n) -> true);

        System.out.println("Print no numbers:");
        evaluate(list, (n) -> false);

        System.out.println("Print even numbers:");
        evaluate(list, (n) -> n % 2 == 0);

        System.out.println("Print odd numbers:");
        evaluate(list, (n) -> n % 2 == 1);

        System.out.println("Print numbers greater than 5:");
        evaluate(list, (n) -> n > 5);

    }

    public static void evaluate(List<Integer> list, Predicate<Integer> predicate) {
        for (Integer n : list) {
            if (predicate.test(n)) {
                System.out.println(n + " ");
            }
        }
    }

    private static void method1() {
        List<Integer> list = Arrays.asList(1, 2, 3, 4, 5);
        for (Integer n : list) {
            System.out.println(n);
        }
        System.out.println("***************");
        //New way:
        list.forEach(n -> System.out.println(n));

        System.out.println("***************");
        //or we can use :: double colon operator in Java 8
        list.forEach(System.out::println);
    }
}
